package cn.infrabase.crypto.digest;

import cn.infrabase.CodeDescEnum;

/**
 * <pre>
 * 摘要算法枚举。
 * 说明：
 * 1、哈希算法（Hash）又称摘要算法（Digest），它的作用是：对任意一组输入数据进行计算，得到一个固定长度的输出摘要。
 * 2、哈希函数的主要作用不是完成数据加密与解密工作，它是用来检验数据完整性的重要技术，运算结果具有不可逆性。
 * 3、通过哈希函数，可以为数据创建"数组指纹"（散列值/哈希值），哈希值通常是一个短的随机字母和数字组成的字符串。
 * 4、哈希函数的常用算法有：MD（消息摘要算法）、SHA（安全散列算法）及Mac（消息认证码算法）。
 * 5、Java中使用SHA1和MD5完全一样，只需要把算法名称改为SHA-1，计算SHA256需要传入SHA-256，计算SHA512，需要传SHA-512。
 * 6、算法：SM3，输出长度（位）：256 bits，输出长度（字节）：32 bytes。
 * 7、算法：MD5，输出长度（位）：128 bits，输出长度（字节）：16 bytes。
 * 8、算法：SHA-1，输出长度（位）：160 bits，输出长度（字节）：20 bytes。
 * </pre>
 *
 * @author Weimin Gao
 * @since 1.0.0
 **/
public enum DigestAlgorithm implements CodeDescEnum<String> {

	/**
	 * SM3密码杂凑算法。
	 */
	SM3("SM3", "SM3密码杂凑算法"),

	/**
	 * MD5消息摘要算法（MD5 Message-Digest Algorithm）。
	 */
	MD5("MD5", "MD5消息摘要算法"),

	/**
	 * SHA-1安全散列算法（Secure Hash Algorithm）。
	 */
	SHA1("SHA-1", "SHA1安全散列算法"),

	/**
	 * SHA-256安全散列算法（Secure Hash Algorithm）。
	 */
	SHA256("SHA-256", "SHA256安全散列算法");

	/**
	 * 摘要算法代码。
	 */
	private final String code;

	/**
	 * 摘要算法描述。
	 */
	private final String desc;

	/**
	 * 构造函数。
	 *
	 * @param code 摘要算法代码。
	 * @param desc 摘要算法描述。
	 */
	DigestAlgorithm(String code, String desc) {
		this.code = code;
		this.desc = desc;
	}

	/**
	 * 返回摘要算法代码。
	 *
	 * @return 摘要算法代码。
	 */
	public String code() {
		return code;
	}

	/**
	 * 返回摘要算法描述。
	 *
	 * @return 摘要算法描述。
	 */
	public String desc() {
		return desc;
	}

	/**
	 * 根据给定的摘要算法代码返回对应的枚举。
	 *
	 * @param code 给定的摘要算法代码。
	 * @return 摘要算法枚举。
	 * @throws DigestAlgorithmNotExistException 如果给定的摘要算法代码不存在时。
	 */
	public static DigestAlgorithm codeOf(String code) throws DigestAlgorithmNotExistException {
		DigestAlgorithm[] algorithms = DigestAlgorithm.values();
		for (DigestAlgorithm algorithm : algorithms) {
			if (algorithm.code().equalsIgnoreCase(code)) {
				return algorithm;
			}
		}
		throw new DigestAlgorithmNotExistException(code);
	}

}
